package org.casper.web;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class FileUploadServlet
 */
public class FileUploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		/**
		 *1. 获取磁盘文件的条目的工厂
		 */
		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
		//String path = request.getRealPath("/pic");   //此方法 官方已不推荐使用了，使用下面这句话，为什么了,通过获取ServletContext对象更加的可靠
		/**
		 *2.获取上传文件要存放的的路径文件夹
		 */
		String fileRepoDir = request.getServletContext().getRealPath("/pic");
		System.out.println(fileRepoDir);
		/**
		 * 设置factory的一些属性
		 */
		diskFileItemFactory.setRepository(new File(fileRepoDir));	//设置暂存空间，上传的文件暂时会放在这个地方的，不然会占用很大的内存，上传文件一般有.tmp格式
		diskFileItemFactory.setSizeThreshold(1024*1024);			//设置缓存的大小，当超过缓存大小的时候，就会直接放到暂存空间
		/**
		 * 文件上传处理器
		 */
		ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
		try {
			List<FileItem> fileItems = fileUpload.parseRequest(request);//获取所有的上传的文件 ，可以实现多文件上传
			for (FileItem fileItem : fileItems) {
				if(fileItem.isFormField()){						//如果是普通表单控件
					System.out.println(fileItem.getFieldName()+"<<>>"+fileItem.getName()+"<<>>"+fileItem.getString());
				}else{											//文件表单控件
					//1.获取文件路径名
					String fileName = fileItem.getName();
					//2.写文件
					fileItem.write(new File(fileRepoDir,fileName));
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}
